<?php
/* 此部分处理壹写作发送的作品数据，基本流程如下
 * 壹写作向您发送作品的相关信息,您需要根据作品的信息转换为您的作品数据库
 */
class Book
{
    static $table = 'book';
    static $table_short = 'b';
    public function __construct()
    {
        $this->db = Mysql::getInstance();
    }
    public function get($filter = null, $id = null, $request_data = null)
    {
        // $contents="## hello\n\n## hello 2 \n\n/*none*/ test \n\n\n @@第3章 快来 \n he**ll**o test \n\n ## hello3 we do it";
        $contents = "##封面\n\n名称：这是一个恋爱的季节\n作者：爱捕风的小蓝\n\n\n文体：小说\n类别：长篇小说 ~ 5 章\n风格：校园\n时间：2018-09-7\n长度：1.7千 字\n阅读章显示：章号与标题\n阅读节显示：节号\n\n##梗概\n\n一句话梗概：爱捕风的小蓝\n\n爱捕风的小蓝爱捕风的小蓝爱捕风的小蓝爱捕风的小蓝\n\n\n\n爱捕风的小蓝爱捕风的小蓝\n\n##人物简介\n\n匿名  24  男  主角    \nstartReplacestartReplacestartReplace||startReplacestartReplacestartReplacestartReplace||startReplacestartReplacestartReplacestartReplace||    startReplace \n\n\n\n##序\n\n标题：序\n\n据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据xx\\n\\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据\\n\\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根\\n\\nxxff据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根xx　　　　\\n\\n\\n\\n##第2章 章标题\\n\\n\\n\\n@@第\n\n\n\n##第1章 章标题\n\n根据根据根据xx根据根\n\nxx据根据根据根据根据xx根据根据根据根据根据根据根xx xx   据根据根据根据根据根据根据根据xxff fff根据根据根据根据根\n\n据根据根据根据根据根据根据根据根据根据根据\n\n根据根据根据根据根据根据根据根据根据根据根据根据xxxxxxxxxxxxxx根据根据根据根据根据根据根据根据根据根据根据\n\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根xx\n\n\n\n@@第1节 节标题\n\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据xx\n\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据\n\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根\n\nxxff据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根xx　　　　\n\n\n\n##第2章 章标题\n\n\n\n@@第1节 节标题\n\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据\n\n\n\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据\n\n\n\n根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据根据\n\n\n\n##第3章 章标题\n\n\n\n##第4章 章标题\n\n@@第1节 第一节 \n\n 这是真的吗，我的**眼**\n\n我能行的\n插图:http://www.baidu.com\n为什么都可以**这是不对**的行为**我特别强调**可以\n了吗?\n\n##第5章 章标题\n\n##附注\n\nhello\n\nbaby\n\nwhat can ido for you\n\n我能，我也能够也能够也能够也能够也能够也能够也能够也能够也能够也能够也能够也能够也能够也能够也能够\n\n也能够也能够\n\n";
        $return['chapters'] = $this->parseChapters($contents);
        return var_dump($return);
    }
    /**发送作品相关信息，同样需要验证来源
     * 发送的内容包括
     * params={
     *   updated//作品更新时间
    booktype, //作品类型 包括 小说 noval，电子书 ebook，剧本 script及聊小说 chat
    author, // 作者名称
    openid, //作者在出版商的用户id
    bid,//作品唯一标识
    created, //作品创建时间
    updateDes, // 最近更新说明
    summary,// 作品梗概
    booktag, //作品分类
    bookstyle, //作品题材
    publishtype, // 作品发布类型，包括 all|sub|signed|signedother 对应 全部|节选|签约|签约其它
    showall,  //显示内容  包括 -1|数字 -1代表全部 ，数字为5代表前5章
    booksize, // 作品长度
    outlink,  // 全本链接地址
    outname,  // 全本发布平台名称
    booktitle, // 作品名称
    bookcover, //作品封面
    bookfile,// 作品内容
    datatype,//数据类型,包括 file与json两种类型
    content,// json格式的作品内容
    }
     */
    protected function post($request_data = null)
    {
        
        $params = json_decode(json_encode($request_data), true);
        //TODO:通过openid与accesstoken验证用户身份
        unset($params['signture']);
        unset($params['timestamp']);
        unset($params['appid']);
        // TODO:此部分逻辑请根据您的库进行处理，以下为示例
        // 示例中通过传递的openid与bid来获得book
        $newbook['uid'] = $params['openid']; //本地用户id
        $newbook['tag'] = $params['booktag'];
        $newbook['style'] = $params['bookstyle'];
        $newbook['booksize'] = $params['booksize'];
        $newbook['author'] = $params['author'];
        $newbook['created'] = $params['created'];
        $newbook['updated'] = $params['updated'];
        $newbook['title'] = $params['booktitle'];
        $newbook['bid'] = $params['bid']; //作品唯一标识符
        $newbook['updateDes'] = $params['updateDes'];
        $newbook['summary'] = $params['summary'];
        $newbook['showall'] = $params['showall'];
        $newbook['bookcover'] = $params['bookcover'];
        //作品下载路径
        $newbook['filepath'] = $params['bookfile'];
        //下载作品 
        if ($params['datatype']==='file'){//文件中获得作品信息

            $contents = file_get_contents($params['bookfile']);
            /**
             * 壹写作的作品格式为ewr文件，一种类似markdown使用标记语言完成的文本格式
             * 样本可参考传送至的文件格式
             * 将作品解析为章节
             **/
            $chapters = $this->parseChapters($contents);

            // TODO: 将章节更新至数据库,本示例仅供参考
            $return['chapter']=array();
            for ($x = 0; $x < count($chapters); $x++) {
                $chapters[$x]['bid'] = $params['bid'];
                $chapters[$x]['uid'] = $params['openid'];
                $exitChapters = $this->db->rs('*', 'chapter', array("cid" => $chapters[$x]['cid'], "bid" => $params['bid'], "uid" => $params['openid']));
                // $return['exitChapters'.$x]=$exitChapters;//FIXME: only for test
                if (count($exitChapters['data'])) {
                    //更新现有章节
                    $exitChapter = $exitChapters['data'][0];
                    $chapters[$x]['ret'] = $this->db->update('chapter', $exitChapter['id'], $chapters[$x]);
                } else {
                    //添加新的章节
                    $chapters[$x]['ret'] = $this->db->insert('chapter', $chapters[$x]);
                }

                $return['chapter']['chapter' . $x] = $chapters[$x]; //FIXME: only for test
            }
            // $return['chapters']=$chapters;//FIXME: 入库
            // return $return;
        }
        else  if ($params['datatype']==='json'){//通过传递的json字符串获得作品信息
           
            //传递的格式如下

            /**
             * 壹写作的作品格式为json数据，您可能通过对json的转换与本库对照进行更新
             **/
            $chapters=json_decode($params['content'],true);
            $return['chapter']=array();
           // return $chapters[0]['cid'];
            // TODO: 将章节更新至数据库,本示例仅供参考
            for ($x = 0; $x < count($chapters); $x++) {
                $chapters[$x]['bid'] = $params['bid'];
                $chapters[$x]['uid'] = $params['openid'];
                $exitChapters = $this->db->rs('*', 'chapter', array("cid" => $chapters[$x]['cid'], "bid" => $params['bid'], "uid" => $params['openid']));
                if (count($exitChapters['data'])) {
                    //更新现有章节
                    $exitChapter = $exitChapters['data'][0];
                    if ($exitChapter['updated']<$chapters[$x]['updated']){ //仅更新需要更新的内容
                       $chapters[$x]['ret'] = $this->db->update('chapter', $exitChapter['id'], $chapters[$x]);
                    }
                } else {
                    //添加新的章节
                    $chapters[$x]['ret'] = $this->db->insert('chapter', $chapters[$x]);
                }
                $return['chapter']['chapter' . $x] = $chapters[$x]; //FIXME: only for test
            }
           // $return['chapters']=$chapters;//FIXME: 入库
           // return $return;
        }
        //更新数据库
        $book = $this->db->rs('*', 'book', array("bid" => $params['bid'], "uid" => $params['openid']));
        if (count($book["data"])) {
            //更新作品基本内容
            $tempbook = $book['data'][0];
            $ret = $this->db->update('book', $tempbook['id'], $newbook);
            if ($ret['error']) {
                $return['error']=true;
                $return['error_code']=$ret['code'];
                $return['error_message']=$ret['message'];
                return $ret;
            } else {
                $return['error']=false;
                $return['bookmessage'] = "作品更新成功";
            }
        } else {
            //添加作品
            $ret = $this->db->insert('book', $newbook);
            if ($ret['error']) {
                $return['error']=true;
                $return['error_code']=$ret['code'];
                $return['error_message']=$ret['message'];
            } else {
                $return['error']=false;
                $return['bookmessage'] = "作品出版成功,正在等待审核，请稍候";
            }
        }
        return $return;

    }
    public function parseChapters($contents)
    {
        //替换特殊字符
        $chapters = array();
        $contents = preg_replace('/\r/', '', $contents);

        $contents = preg_replace('/^\n+|\n+$/', '', $contents);

        $contents = preg_replace('/^\t+|^ {3,}/', '', $contents);
        //替换内容中的备注

        $contents = preg_replace('/(^\/\*|^\*\/)$/m', '\n$1\n', $contents);
        /*  print_r("\n4");*/
        //print_r($contents);
        $contentArray = preg_split('/(?:##)+ *(.*)\n{2,}/', $contents, -1, PREG_SPLIT_DELIM_CAPTURE);
        // print_r("\n----------contentArray-----------\n");
        //  print_r($contentArray);
        $chapternumber = 1; //章编号
        $managenumber = 1; //卷编号
        while (count($contentArray)) {
            $content = array_shift($contentArray);
            //  print_r($content);
            //    print_r("\n");
            $sectiontitle = $content;
            preg_match('/(第(\d+)(章|卷|集)) *(.*)/', $sectiontitle, $matches);
            if (count($matches) > 3) {
                $sectiontitle = $matches[3];
            }
            //print_r("\n----------matches-----------\n");
            //var_dump($matches);
            //  print_r("\n----------sectiontitle-----------\n");
            //  print_r($sectiontitle);
            switch ($sectiontitle) {
                case "章":
                case "集":
                    $chapter['cid'] = 'c' . $chapternumber;
                    $chapternumber++;
                    $chapter['title'] = $content;
                    $chapter['body'] = $this->parseBody(array_shift($contentArray));
                    // print_r("\n----------chapter-----------\n");
                    // print_r($chapter);
                    array_push($chapters, $chapter);
                    break;
                case "序":
                    $chapter['cid'] = 'primary';
                    $chapter['title'] = $content;
                    $chapter['body'] = $this->parseBody(array_shift($contentArray));
                    //  print_r("\n----------chapter-----------\n");
                    // print_r($chapter);
                    array_push($chapters, $chapter);
                    break;
                case "封面": //TODO:
                case "封页": //TODO:
                    $chapter['cid'] = 'cover';
                    $chapter['title'] = $content;
                    $chapter['body'] = $this->parseBody(array_shift($contentArray));
                    // print_r("\n----------chapter-----------\n");
                    // print_r($chapter);
                    // array_push($chapters,$chapter);
                    break;
                case "附注": //TODO:
                    $chapter['cid'] = 'note';
                    $chapter['title'] = $content;
                    $chapter['body'] = $this->parseBody(array_shift($contentArray));
                    // print_r("\n----------chapter-----------\n");
                    // print_r($chapter);
                    array_push($chapters, $chapter);
                    break;
                case "卷": //TODO:
                    $chapter['title'] = $content;
                    $chapter['body'] = $this->parseBody(array_shift($contentArray));
                    $chapter['cid'] = 'm' . $managenumber;
                    $managenumber++;
                    array_push($chapters, $chapter);
                    break;
                case "梗概":
                    $chapter['cid'] = 'summary';
                    $chapter['title'] = $content;
                    $chapter['body'] = $this->parseBody(array_shift($contentArray));
                    //array_push($chapters,$chapter);
                    break;
                case "人物简介":
                    $chapter['cid'] = 'actors';
                    $chapter['title'] = $content;
                    $chapter['body'] = $this->parseBody(array_shift($contentArray));
                    array_push($chapters, $chapter);
                    break;
                default:
                    break;
            }

        }
        //  print_r("\n----------chapters-----------\n");
        //  print_r($chapters);
        return $chapters;
    }
    /**
     * 按照出版商对作品的要求对标记内容进行转换，也可直接转为html格式
     * 文件内容部分的标记消除
     */
    public function parseBody($body)
    {
        //可选消除节标记
        $body = preg_replace('/^@@(第(\d+)(场|节|聊)) *(.*)/m', '$4', $body);
        //可选消除所有图片标记
        $body = preg_replace('/^插图[:：](.*)$/m', '', $body);
        //可选消除所有加粗标记
        $body = preg_replace('/(\*{2}(?=.+\*{2}))(.+?)(\*{2})/m', '$2', $body);
        //可选消除所有居中标记
        $body = preg_replace('/(\*{1}(?=.+\*{1}))(.+?)(\*{1})/m', '$2', $body);
        //可选消除所有倾斜标记
        return $body;
    }
}
